package org.joot.jmir2.display;

import static org.lwjgl.opengl.GL11.*;

import org.joot.jmir2.texture.Texture;

/**
 * OpenGL绑定类
 * <br>
 * 包含显卡纹理绘制
 * <br>
 * 显卡功能参数
 * <br>
 * 显卡功能支持项等信息
 */
public final class OpenGL {

	/* 单例 */
	private static OpenGL single = new OpenGL();
	private OpenGL() { }
	
	/** 获取进程唯一实例 */
	public static OpenGL get() {
		return single;
	}
	
	/**
	 * 绘制2D纹理图
	 * 
	 * @param tex
	 * 		要绘制的纹理
	 * @param x
	 * 		绘制左上角
	 * @param y
	 * 		绘制右下角
	 */
	public void drawTexture2DNormal(Texture tex, int x, int y) {
		if(tex == null) return;
		drawTex2D(tex.getTextureID(), x, y, tex.getWidth(), tex.getHeight());
	}
	
	/**
	 * 绘制2D纹理图
	 * <br>
	 * 启用混合
	 * 
	 * @param tex
	 * 		要绘制的纹理<br>纹理会与已绘制的纹理进行颜色混合
	 * @param x
	 * 		绘制区域左上角
	 * @param y
	 * 		绘制区域右下角
	 */
	public void drawTexture2DAdd(Texture tex, int x, int y) {
		if(tex == null) return;
		fixBlendAdd();
		drawTex2D(tex.getTextureID(), x, y, tex.getWidth(), tex.getHeight());
		fixBlendNormal();
	}
	
	/** 在制定区域绘制纹理图片，绘制区域以(x,y)为左上角。以width为宽度，以height为高度 */
	private void drawTex2D(int textureId, int x, int y, int width, int height) {
		glTranslatef(x, y, 0);
		glBindTexture(GL_TEXTURE_2D, textureId);
		glBegin(GL_QUADS);
			glTexCoord2f(0, 0);
			glVertex2f(0, 0);
			glTexCoord2f(1, 0);
			glVertex2f(width, 0);
			glTexCoord2f(1, 1);
			glVertex2f(width, height);
			glTexCoord2f(0, 1);
			glVertex2f(0, height);
		glEnd();
		glBindTexture(GL_TEXTURE_2D, 0);
		glLoadIdentity();
	}

	/** 将纹理色彩混合模式恢复为普通<br>即只处理透明色 */
	private void fixBlendNormal() {
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	}
	/** 将纹理色彩混合模式设置为叠加当前色彩，保留目标色彩所有颜色 */
	private void fixBlendAdd() {
		glBlendFunc(GL_SRC_COLOR, GL_ONE);
	}
}